#include "wx/wxprec.h"
#include "wx/aboutdlg.h"
#include "wx/generic/aboutdlgg.h"
#include "wx/gtk/private.h"

class GtkStr : public wxGtkString {
  public:
    GtkStr( const wxString& s ) : wxGtkString( wx_const_cast( char *, wxGTK_CONV_SYS( s ).release() ) ) {
    }
};

class GtkArray {
  public:
    GtkArray() : m_strings( 0 ), m_count( 0 ) { }
    GtkArray( const wxArrayString& a ) {
      m_count = a.size();
      m_strings = new const gchar *[m_count + 1];
      for( size_t n = 0; n < m_count; n++ ) {
        m_strings[n] = wxGTK_CONV_SYS( a[n] ).release();
      }
      m_strings[m_count] = NULL;
    }
    operator const gchar **() const { return m_strings; }
    ~GtkArray() {
      for( size_t n = 0; n < m_count; n++ ) {
        free( wx_const_cast( gchar *, m_strings[n] ) );
      }
      delete [] m_strings;
    }

  private:
    const gchar **m_strings;
    size_t m_count;
    DECLARE_NO_COPY_CLASS( GtkArray )
};

extern "C" void
wxGtkAboutDialogOnClose( GtkAboutDialog *about ) {
  gtk_widget_destroy( GTK_WIDGET( about ) );
}

extern "C" void
wxGtkAboutDialogOnLink( GtkAboutDialog * ( about ), const gchar *link, gpointer( data ) ) {
  wxLaunchDefaultBrowser( wxGTK_CONV_BACK( link ) );
}

void wxAboutBox( const wxAboutDialogInfo& info ) {
  if( !gtk_check_version( 2, 6, 0 ) ) {
    GtkAboutDialog * const dlg = GTK_ABOUT_DIALOG( gtk_about_dialog_new() );
    gtk_about_dialog_set_name( dlg, GtkStr( info.GetName() ) );
    if( info.HasVersion() ) {
      gtk_about_dialog_set_version( dlg, GtkStr( info.GetVersion() ) );
    }
    if( info.HasCopyright() ) {
      gtk_about_dialog_set_copyright( dlg, GtkStr( info.GetCopyrightToDisplay() ) );
    } else {
      gtk_about_dialog_set_copyright( dlg, NULL );
    }
    if( info.HasDescription() ) {
      gtk_about_dialog_set_comments( dlg, GtkStr( info.GetDescription() ) );
    }
    if( info.HasLicence() ) {
      gtk_about_dialog_set_license( dlg, GtkStr( info.GetLicence() ) );
    }
    wxIcon icon = info.GetIcon();
    if( icon.Ok() ) {
      gtk_about_dialog_set_logo( dlg, info.GetIcon().GetPixbuf() );
    }
    if( info.HasWebSite() ) {
      gtk_about_dialog_set_url_hook( wxGtkAboutDialogOnLink, NULL, NULL );
      gtk_about_dialog_set_website( dlg, GtkStr( info.GetWebSiteURL() ) );
      gtk_about_dialog_set_website_label( dlg, GtkStr( info.GetWebSiteDescription() ) );
    }
    if( info.HasDevelopers() ) {
      gtk_about_dialog_set_authors( dlg, GtkArray( info.GetDevelopers() ) );
    }
    if( info.HasDocWriters() ) {
      gtk_about_dialog_set_documenters( dlg, GtkArray( info.GetDocWriters() ) );
    }
    if( info.HasArtists() ) {
      gtk_about_dialog_set_artists( dlg, GtkArray( info.GetArtists() ) );
    }
    wxString transCredits;
    if( info.HasTranslators() ) {
      const wxArrayString& translators = info.GetTranslators();
      const size_t count = translators.size();
      for( size_t n = 0; n < count; n++ ) {
        transCredits << translators[n] << _T( '\n' );
      }
    } else {
      wxString translator = _( "translator-credits" );
      if( translator != wxT( "translator-credits" ) ) {
        transCredits = translator;
      }
    }
    if( !transCredits.empty() ) {
      gtk_about_dialog_set_translator_credits( dlg, GtkStr( transCredits ) );
    }
    g_signal_connect( dlg, "response", G_CALLBACK( wxGtkAboutDialogOnClose ), NULL );
    gtk_widget_show( GTK_WIDGET( dlg ) );
    return;
  }
  wxGenericAboutBox( info );
}

